#ifndef __M_LOGGER_H__   //记得要加上ifndf！！！！！和后面的endif对应
#define __M_LOGGER_H__   //如果未定义，则定义该宏，并继续编译后续代码。

#include<stdio.h>
#include<time.h>
#define INF 0
#define DBG 1
#define ERR 2
#define LOG_LEVEL DBG
//规定日志等级，某些等级一下的内容不需要打印！！！！

////注意，进行宏替换时，调用LOG时，第一个参数是format，剩下的所有参数即...自动替换为__VA_ARGS__------注意，这些参数都不需要写出类型！！！！！
//转换时间四部曲！！！！！
//可以在日志处显示时间！！！！
//time_t t = time(NULL);\
//    struct tm* lt = localtime(&t);\
//    char buf[32] = {0};\
//    strftime(buf, 31, "%H:%M:%S", lt); \
//这里每一行后面都要加"\"的目的是因为宏定义要求为同一行！！！！！
//##__VA_ARGS__   ##一定要加，防止就串了一个参数过来！！！

#define LOG(level,format, ...)  do{ \
    if (level < LOG_LEVEL) break;\
    time_t t = time(NULL);\
    struct tm* lt = localtime(&t);\
    char buf[32] = {0};\
    strftime(buf, 31, "%H:%M:%S", lt); \
    fprintf(stdout,"[%s %s:%d]" format "\n",buf, __FILE__ ,__LINE__, ##__VA_ARGS__);\
} while(0)


//可以看出来，define的省略用...    被define的不定参数用__VA_ARGS__
#define INF_LOG(format, ...) LOG(INF, format, ##__VA_ARGS__)//再次进行宏替换，gobang.cc直接使用的就是下面三种
#define DBG_LOG(format, ...) LOG(DBG, format, ##__VA_ARGS__)
#define ERR_LOG(format, ...) LOG(ERR, format, ##__VA_ARGS__)

#endif   //结束条件编译块。